#!/bin/bash

#建议：
#  1分钟运行1次该程序
#  运行DUMP_CHECK_TIME次后，删除原来dump文件

#更改工作目录
pwd
cd `dirname $0`
pwd

. ./conf.sh

#注意:系统只能有一个tcpdump
#修改系统参数
RUN_APP=apm
TCPDUMP_PARAMETER=" tcp or udp -i $VAR_DEV "
DUMP_CHECK_TIME=15

DUMP_DIR="/opt/apm/dump"
DUMP_CORE=core
DUMP_FILE=test_dump
DUMP_INI="check_tims.ini"

#linux命令
TCPDUMP=/usr/sbin/tcpdump
PIDOF=/sbin/pidof

#检查环境
check_env()
{
	local username=`whoami`
	if [ "$username" != "root" ]; then
		echo "please run root"
		exit
	fi

	mkdir -p ${DUMP_DIR}
	mkdir -p ${DUMP_DIR}/${DUMP_CORE}

	return 1;
}

#启动tcpdump抓包
start_dump()
{
	#超过次数删除dump文件
	var_times=1
	if [ -f ${DUMP_DIR}/${DUMP_INI} ]; then 
		var_times=`cat ${DUMP_DIR}/${DUMP_INI}`
	else
		echo "1" > ${DUMP_DIR}/${DUMP_INI}
	fi
	let var_times=$var_times+1

	var_cnt=`${PIDOF} tcpdump | wc -l`
	if [ ${var_cnt} -gt 0 ]; then
		if [ ${var_times} -lt ${DUMP_CHECK_TIME} ]; then
			echo "${var_times}" > ${DUMP_DIR}/${DUMP_INI}
			return 1;
		fi
		${PIDOF} tcpdump | xargs kill
	fi

	#启动数据抓包
	rm -f ${DUMP_DIR}/${DUMP_FILE}.pcap > /dev/null 2>&1
	${TCPDUMP} ${TCPDUMP_PARAMETER} -w ${DUMP_DIR}/${DUMP_FILE}.pcap &
	echo "1" > ${DUMP_DIR}/${DUMP_INI}
	sleep 1

	return 1;
}

#生成dumpfile
check_apm()
{
	local var_date_now=`date +%Y%m%d%H%M`
	local var_corefile=${DUMP_FILE}_${var_date_now}

	# 检查协议解析参数是否在运行
	local var_cnt=`${PIDOF} ${RUN_APP} | wc -l`
	if [ ${var_cnt} -gt 0 ]; then
		start_dump;
		return 1;
	fi

	#关闭tcpdump应用程序
	var_cnt=`${PIDOF} tcpdump | wc -l`
	if [ ${var_cnt} -gt 0 ]; then
		${PIDOF} tcpdump | xargs kill
	fi
	#拷贝tcpdump数据包
	if [ -f ${DUMP_DIR}/${DUMP_FILE}.pcap ]; then 
		mv ${DUMP_DIR}/${DUMP_FILE}.pcap  ${DUMP_DIR}/${DUMP_CORE}/${var_corefile}.pcap > /dev/null 2>&1
		echo "tcpdump: ${DUMP_DIR}/${DUMP_CORE}/${var_corefile}.pcap"
	fi 
	
	exit
}

#程序开始

#运行环境检查
check_env;

#生成dumpfile
check_apm;

